package com.zw.a.basic.a15.demo03_reflect;

import com.itheima.pojo.Student;

import java.lang.reflect.Constructor;

//案例: 通过反射获取私有构造方法并创建对象
/*
    Constructor单词的意思就是: 构造方法, 构造器.

    反射获取构造方法涉及到的API, 以下全部都是Class类中的方法
        public Constructor getDeclaredConstructor(Class... params);  根据传入的参数类型, 获取其对应的构造方法对象(包括私有)

    Constructor 构造器类中的成员方法:
        public T newInstance(Object... values);          根据类的构造方法直接创建对象, 并设置值.
        public void setAccessible(boolean flag);         暴力反射, 如果传true, 说明取消访问检查.

    获取构造方法的目的:
        通过反射的形式, 创建该类的对象.
 */
public class Demo04 {
    public static void main(String[] args) throws Exception {
        //需求: 通过反射获取公共的构造方法并创建对象
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");

        //2. 通过Constructor构造器对象, 来创建学生类的对象.
        //2.1 获取指定的构造器对象.
        Constructor<?> con = clazz.getDeclaredConstructor(String.class);

        //2.2 暴力反射, 即: 取消访问检查.
        con.setAccessible(true);

        //2.3 根据构造器对象, 来创建学生类的对象.
        Student s2 = (Student) con.newInstance("刘亦菲");

        //4. 打印
        System.out.println(s2);
    }
}
